package com.itheima.service.impl;

import com.itheima.dao.IAccountDao;
import com.itheima.dao.impl.AccountDaoImpl;
import com.itheima.service.IAccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * 账户的业务层实现类
 *
 * 注解的注入
 * 用于创建对象的
 *      他们的作用就和在xml配置文件中编写一个额<bean></bean>标签实现的功能是一样的
 *      Component
 *              作用：用于当前类对象存入spring容器中
 *              属性：
 *                   value：用于指定bean的id。当我们不写时，它是默认值是当前类名，且首字母小写
 *      Controller：一般用于表现层
 *      Service：一般用于业务层(service)
 *      Repository：一般用于持久层（dao)
 *      以上三个注解他们的作用和属性与component是一模一样的。
 *
 * 用于注入数据的
 *      他们的作用就和在xml配置文件中的bean标签中写的一个<property></property>标签的作用是一样的
 *      Autowired:
 *          作用：自动注入按照类型注入，只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配，就可以注入
 *               如果ioc容器中没有任何bean的类型和要注入的变量类型匹配，则报错。
 *               如果ico容器中有多个类型匹配时，按照变量名进行匹配，没有相对应的，则报错。
 *      Qualifier:（它必须和Autowired一起使用）
 *           作用：在按照类中注入的基础之上再按照名称注入，它在给类成员注入时不能单独使用，但是再给方法参数注入时可以。
 *          属性：
 *              value：用于指定注入的bean的id
 *       Resource:
 *          作用：直接按照bean的id注入，它可以独立使用
 *          属性：
 *              name：用于指定bean的id
 *  以上三个注解都只能注入其他bean的类型数据，而基本类型和String类型无法使用上述注解实现
 *  另外，集合类型的注入只能通过xml来实现
 *         value：
 *          作用：用于注入基本类型和String类型的数据
 *          属性：
 *              value：用于指定的数据值，它可以使用spring中SPEL（也就是spring的el表达式）
 *                      SPEL的写法，&（表达式）
 * 用于改变作用范围
 *      他们的作用就和在xml配置文件中的bean标签中使用scope属性实现的功能是一样的
 *     Scope:（默认是单例的）
 *          作用：用于指定bean的作用范围
 *          属性：
 *              value：指定范围的取值，常用取值:singleton（单例的）,prototype(多例的）
 * 和生命周期相关
 *      他们的作用就和在xml配置文件中的bean标签中使用init-method和destroy-method的作用一样的
 *      PreDestroy:用于指定销毁方法
 *      PostConstruct:用于指定初始化方法
 */
@Component
public class AccountServiceImpl implements IAccountService {

//    @Autowired
//    @Qualifier("accountDao")
    @Resource(name = "accountDao")
    private IAccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
